package com.zsp.utils.security_jwt;

import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component // 标记为 Spring 容器的组件，使其可以被注入使用
public class JwtUtil {

    // 从配置文件 application.yml 或 application.properties 中读取 JWT 密钥
    @Value("${jwt.secret}")
    private String secretKey; // 用于签名 JWT 的密钥（不要硬编码，需从配置读取）

    // 从配置文件中读取 JWT 的过期时间，单位为秒
    @Value("${jwt.expiration}")
    private long expiration; // Token 的有效期时间，推荐值为几分钟到几小时，根据业务调整

    /**
     * 生成 JWT Token
     * @param user 用户
     * @return 加密后的 JWT 字符串
     */
    public String generateToken(UserLogin user) {
        return Jwts.builder()
                .setSubject(JSONUtil.toJsonStr(user)) // 设置 Token 的主体
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) // 设置 Token 有效期：当前时间 + 配置的过期时间
                .signWith(SignatureAlgorithm.HS256, secretKey) // 使用 HS256 算法，将 Token 加密并签名
                .compact(); // 返回紧凑的 JWT 字符串
    }

    /**
     * 从 JWT Token 中提取 Claims（有效载荷）
     * @param token 前端传递的 JWT Token
     * @return Claims 对象（包括 Token 中的所有信息，如主体、过期时间等）
     */
    public Claims extractClaims(String token) {
        return Jwts.parser() // 创建 Token 解析器
                .setSigningKey(secretKey) // 设置解析用的签名密钥（必须与生成 Token 时使用的密钥一致）
                .parseClaimsJws(token) // 解析传入的 Token
                .getBody(); // 返回解析后的 Claims（包含主体、过期时间等信息）
    }
}
